package com.vf.s.mvc.sync.common.task.http;

import java.util.Calendar;
import java.util.Date;

import com.jfinal.ext.kit.DateKit;
import com.jfinal.kit.StrKit;
import com.jfinal.log.Log;
import com.vf.core.render.RenderBean;
import com.vf.s.common.model.biz.BizLayer;
import com.vf.s.common.model.sync.BizSyncDataLog;
import com.vf.s.common.model.sync.BizSyncDataTask;
import com.vf.s.mvc.sync.common.model.DataTotal;
import com.vf.s.mvc.sync.common.task.http.handle.PointExecutor;

import net.sf.json.JSONObject;

public class HttpTaskHandle {

	protected final static Log LOG = Log.getLog(HttpTaskHandle.class);

	public static void handle(BizSyncDataTask task) {
		if (StrKit.isBlank(task.getUrl())) {
			task.setStatus("0");
			task.update();
			LOG.debug(String.format("无效任务定义【%s】!!!", task.getName()));
			return;
		}
		
		//不合规范
		if(StrKit.isBlank(task.getMonth()) && StrKit.isBlank(task.getDay())
				&& StrKit.isBlank(task.getHour()) && StrKit.isBlank(task.getMinute()) && StrKit.isBlank(task.getSecond())) {
			task.setStatus("0");
			task.update();
			LOG.debug(String.format("无效任务定义【%s】!!!", task.getName()));
			return;
		}
		
		BizLayer bizLayer=BizLayer.dao.findById(task.getLayerId());
		if (bizLayer==null  || StrKit.isBlank(bizLayer.getDefaultStyleId())) {
			task.setStatus("0");
			task.update();
			LOG.debug(String.format("无效任务定义【%s】,请指定导入图层或确认指定图层是否已设置样式!!!", task.getName()));
			return;
		}
		

		Date nextTime = task.getNextTime();// 下一次执行时间
		// 时间不到不执行
		if (nextTime != null && new Date(System.currentTimeMillis()).getTime() < nextTime.getTime()) {
			return;
		}

		// 是否有运行的进程
		BizSyncDataLog bizSyncDataLog=BizSyncDataLog.dao.findFirst("SELECT * FROM "+BizSyncDataLog.TABLE_NAME+" WHERE taskId=? AND status='0' ", task.getId());
		if (bizSyncDataLog!=null ) {
			if (task.getLockTime() < task.getBreakTime()) {
				int LockTime = task.getLockTime() + 1;
				task.setLockTime(LockTime);
				task.setNextTime(getNextTime(task));
				task.update();
				return;
			}else {
				task.setStatus("0");
				task.update();
				LOG.debug(String.format("【%s】线程阻塞，请联系管理员!!!", task.getName()));
				return;
			}
		}
		//开始执行
		doTask( bizLayer, task);

	}
	

	private static void doTask(BizLayer bizLayer,BizSyncDataTask task) {
		
		// 调用接口获取数据总量
		RenderBean result = null;
		if (StrKit.equals("GET", task.getMethod())) {
			result=HttpUtil.doGet(
					task.getUrl(), task.getId(), task.getCode(),task.getName(),
					DateKit.toStr(task.getLastTime(), "yyyy-MM-dd hh:mm:ss "),
					DateKit.toStr(task.getLastTime(), "yyyy-MM-dd hh:mm:ss ")
					,0,
					task.getParam(),1, task.getPageSize());
		} else {
		}
		
		if(result==null) {
			task.setNextTime(getNextTime(task));
			task.update();
			LOG.debug(String.format("【%s】接口异常，不执行!!!", task.getName()));
			return;
		}
		
		if(result.getCode()!=200) {
			task.setNextTime(getNextTime(task));
			task.update();
			LOG.debug(String.format("【%s】接口异常，不执行!!!", task.getName()));
			return;
		}
		
		DataTotal dataTotal = null;
		try {
			JSONObject jsonObject = JSONObject.fromObject(result.getData());
			dataTotal = (DataTotal) JSONObject.toBean(jsonObject, DataTotal.class);
			if (dataTotal == null) {
				task.setNextTime(getNextTime(task));
				task.update();
				LOG.debug(String.format("【%s】接口异常，不执行!!!", task.getName()));
				return;
			}
		}catch (Exception e) {
			task.setStatus("0");
			task.update();
			LOG.debug(String.format("【%s】接口异常，停止执行!!!", task.getName()));
			return;
		}

		if (dataTotal.getSize() == 0) {
			task.setNextTime(getNextTime(task));
			task.update();
			LOG.debug(String.format("【%s】接口成功，同步数据量【%s】!!!", task.getName(),dataTotal.getSize()));
			return;
		}
		
		
		long total = dataTotal.getSize();
		int pageSize = task.getPageSize();
		long totalPage = getPages(total, pageSize);
		// 分线程拉取数据
		
		
		//什么鬼
		//点 -坐标 、属性（文本、视频、图片、全景、属性）、过滤条件
		//线 -坐标 、属性（文本、视频、图片、全景、属性）、过滤条件
		//面 -坐标 、属性（文本、视频、图片、全景、属性）、过滤条件
		task.setLockTime(0);task.update();
		
		PointExecutor pointExecutor=new PointExecutor();
		pointExecutor.handle( bizLayer, task, dataTotal, totalPage);
	}

	// 总数据量

	// 上次拉取结束 时间

	/**
	 * 总页数
	 * @param total    总数
	 * @param pageSize 每页显示数
	 * @return
	 */
	private static long getPages(long total, int pageSize) {
		return (total + pageSize - 1) / pageSize;
	}

	/**
	 * 计算下次执行时间
	 * @param task
	 * @return
	 */
	public static Date getNextTime(BizSyncDataTask task) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date(System.currentTimeMillis()));
		if (!StrKit.isBlank(task.getMonth())) {
			cal.add(Calendar.MONTH, Integer.parseInt(task.getMonth()));// 月
		}
		if (!StrKit.isBlank(task.getDay())) {
			cal.add(Calendar.DATE, Integer.parseInt(task.getDay()));// 月
		}
		if (!StrKit.isBlank(task.getHour())) {
			cal.add(Calendar.HOUR, Integer.parseInt(task.getHour()));// 月
		}
		if (!StrKit.isBlank(task.getMinute())) {
			cal.add(Calendar.MINUTE, Integer.parseInt(task.getMinute()));// 月
		}
		if (!StrKit.isBlank(task.getSecond())) {
			cal.add(Calendar.SECOND, Integer.parseInt(task.getSecond()));// 月
		}
		return cal.getTime();
	}

}
